/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package progettojava;

/**
 *
 * @author donZ
 */

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class XMLChecker {
 public static void main(String[] args){
     XMLChecker prova = new XMLChecker();
     prova.parseFile();
     prova.rootCorrect();
     prova.isCorrect();
     prova.finalCorrect();
 }
 
    Document document;
    
    public void parseFile() {
        try {
            
       //Creo un SAXBuilder e lo uso  costruire un document
      SAXBuilder builder = new SAXBuilder();
      //creo un document sul file XML costruito dal builder a sua volta su un oggetto File generico
      document = builder.build(new File("impostazioni.xml")); 
     
       //Prendo la radice <game>
      Element root1 =document.getRootElement();
      //Estraggo i figli del primo figlio della radice(cioÃ¨ i figli di<phrases>) della radice
      List children = root1.getChild("phrases").getChildren();
      Iterator iterator = children.iterator();
     
      //Faccio ciclare l'Iterator sui figli di <games> --> ELEGANTISSSSSSSSIMO
      while(iterator.hasNext())
      {
         Element item = (Element)iterator.next();
         Element text = item.getChild("text");
         Element hint = item.getChild("hint");
         //System.out.println("Frase: "+text.getText());
         //System.out.println("Suggerimento: "+hint.getText());
      }
    }
    catch (Exception e) 
    {
      System.err.println("Errore durante la lettura dal file");
    }
}
    
    Element root;
    boolean radice = false;
    boolean right = false;
   
    /**
     * Metodo che controlla che ci sia una radice e che il suo nome sia esattamente game
     * @return
     */
    public boolean rootCorrect() {

        try {
            root = document.getRootElement();
            String nameRoot = root.getName();
            if(nameRoot.equalsIgnoreCase("game")) {
            radice = true;
            right = true;
            }
        } catch (NullPointerException npe){
            //System.out.println("Il file è sintatticamente non corretto");
        }
        return radice;
    }
    
    
   /**
    * Metodo che controlla che i discendenti della radice siano presenti e che siano scritti correttamente. 
    * Controlla anche che per i cinque campi che richiedono l'immissione di dati, gli stessi siano presenti
    * @return
    */
    public boolean isCorrect() {
        
        if (radice == true){//se non passo questo controllo non posso controllare dopo
        
                right = true;
                
                try {
                    //Controllo l'esistenza di phrases
                    Element phrases = root.getChild("phrases");
                                        
                    //Controllo l'esistenza di players
                    Element players = root.getChild("players");
                                        
                    //Controllo l'esistenza di wheel
                    Element wheel = root.getChild("wheel");
                                        
                    //Controllo l'esistenza di phrase
                    Element phrase = phrases.getChild("phrase");
                                        
                    //Controllo l'esistenza di player
                    Element player = players.getChild("player");
                                        
                    //Controllo l'esistenza di elements
                    Element elements = wheel.getChild("elements");
                                        
                    //Controllo l'esistenza di text e l'immissione di dati
                    Element text = phrase.getChild("text");
                    String nameText = text.getTextTrim().replaceAll(" ","");
                    
                    if(nameText.equalsIgnoreCase("")) {
                    right = false;
                    } 
                    
                     //Controllo l'esistenza di hint e l'immissione di dati
                    Element hint = phrase.getChild("hint");
                    String nameHint = hint.getTextTrim().replaceAll(" ","");
                    
                    if(nameHint.equalsIgnoreCase("")) {
                    right = false;
                    } 
                    
                    //Controllo l'esistenza di name e l'immissione di dati
                    Element name = player.getChild("name");
                    String nameName = name.getTextTrim().replaceAll(" ","");
                    
                    if(nameName.equalsIgnoreCase("")) {
                    right = false;
                    } 
                    
                    //Controllo l'esistenza di element
                    Element element = elements.getChild("element");
                                       
                    //Controllo l'esistenza di value e l'immissione di dati
                    Element value = element.getChild("value");
                    String nameValue = value.getTextTrim().replaceAll(" ","");
                    
                    if(nameValue.equalsIgnoreCase("")) {
                    right = false;
                    } 
                    
                    //Controllo l'esistenza di probability e l'immissione di dati
                    Element probability = element.getChild("probability");
                    String nameProbability = probability.getTextTrim().replaceAll(" ","");
                    
                    if(nameProbability.equalsIgnoreCase("")) {
                    right = false;
                    } 
                    
                } catch (NullPointerException npe){
                    System.out.println("Il file non è semanticamente corretto");
                    npe.printStackTrace();
                    right = false;
                } 
            }
         return right;       
    }
        
    /**
     * Meotodo che confrontando il risultato dei due metodi precedenti ritorna un booleano 
     * che specifica se il file XML è pedissequo alle specifiche e di conseguenza utilizzabile dal programma
     * @return
     */
    public boolean finalCorrect() {
    
        boolean finale = false;
        if(right == true && radice == true) {
            System.out.println("File OK");
            finale = true;
        } else {
            System.out.print("File KO");
        }
        
        return finale;
        
    }
} 
        
        
        
 

  
